package widgets

import (
	"fmt"
	"strings"

	"fyne.io/fyne/v2"
	"fyne.io/fyne/v2/container"
	"fyne.io/fyne/v2/widget"
)

// 默认行高（每行约24像素，包含行间距）
const defaultLineHeight = float32(24)

// LinedEntryConfig 统一的多行文本框配置
type LinedEntryConfig struct {
	MinRows       int
	ReadOnly      bool
	DynamicHeight bool
	MaxHeight     float32
	Wrapping      fyne.TextWrap
}

// LinedEntry 带行号的多行文本输入框
type LinedEntry struct {
	widget.BaseWidget
	lineNumbers   *widget.Label
	entry         *widget.Entry
	container     *fyne.Container
	dynamicHeight bool
	maxHeight     float32
}

// NewLinedEntry 创建带行号的多行文本输入框
func NewLinedEntry(config LinedEntryConfig) *LinedEntry {
	le := &LinedEntry{
		lineNumbers:   widget.NewLabel("1"),
		entry:         widget.NewMultiLineEntry(),
		dynamicHeight: config.DynamicHeight,
		maxHeight:     config.MaxHeight,
	}

	le.lineNumbers.TextStyle = fyne.TextStyle{Bold: false, Italic: true}
	le.lineNumbers.Importance = widget.LowImportance
	// 设置行号固定宽度
	le.lineNumbers.Resize(fyne.NewSize(40, 1))

	// 应用配置
	le.entry.Wrapping = config.Wrapping
	le.entry.SetMinRowsVisible(config.MinRows)

	// 设置文本变化回调
	le.entry.OnChanged = func(s string) {
		le.updateLineNumbers()
		if le.dynamicHeight {
			le.adjustHeight()
		}
	}

	// 如果是只读模式，禁用编辑
	if config.ReadOnly {
		le.entry.Disable()
	}

	// 使用Border布局：行号在左侧，文本框填满剩余空间
	le.container = container.NewBorder(nil, nil, le.lineNumbers, nil, le.entry)
	le.ExtendBaseWidget(le)

	// 设置初始高度与MinRows成正比（现在container已创建）
	le.setInitialHeight(config.MinRows)

	return le
}

// updateLineNumbers 更新行号显示
func (le *LinedEntry) updateLineNumbers() {
	text := le.entry.Text
	lines := strings.Split(text, "\n")
	lineCount := len(lines)
	if text == "" {
		lineCount = 1
	}

	var linesText strings.Builder
	for i := 1; i <= lineCount; i++ {
		linesText.WriteString(fmt.Sprintf("%d\n", i))
	}

	le.lineNumbers.SetText(linesText.String())
}

// setInitialHeight 设置初始高度与MinRows成正比
func (le *LinedEntry) setInitialHeight(minRows int) {
	if minRows <= 0 {
		minRows = 1
	}

	// 计算初始高度
	lineHeight := defaultLineHeight
	initialHeight := float32(minRows) * lineHeight

	// 确保不小于最小高度
	if initialHeight < defaultLineHeight {
		initialHeight = defaultLineHeight
	}

	// 设置容器初始高度
	if le.container != nil {
		le.container.Resize(fyne.NewSize(le.container.Size().Width, initialHeight))
	}
}

// adjustHeight 根据内容行数动态调整高度
func (le *LinedEntry) adjustHeight() {
	text := le.entry.Text
	lines := strings.Split(text, "\n")
	lineCount := len(lines)
	if text == "" {
		lineCount = 1
	}

	// 计算合适的高度
	minHeight := defaultLineHeight // 最小高度
	lineHeight := defaultLineHeight
	contentHeight := float32(lineCount) * lineHeight

	// 限制最大高度
	if contentHeight > le.maxHeight {
		contentHeight = le.maxHeight
	}
	if contentHeight < minHeight {
		contentHeight = minHeight
	}

	// 调整容器高度
	if le.container != nil {
		le.container.Resize(fyne.NewSize(le.container.Size().Width, contentHeight))
	}
}

// SetText 设置文本内容
func (le *LinedEntry) SetText(text string) {
	le.entry.SetText(text)
	le.updateLineNumbers()
}

// Text 获取文本内容
func (le *LinedEntry) Text() string {
	return le.entry.Text
}

// SetPlaceHolder 设置占位符
func (le *LinedEntry) SetPlaceHolder(text string) {
	le.entry.SetPlaceHolder(text)
}

// SetMinRowsVisible 设置最小可见行数
func (le *LinedEntry) SetMinRowsVisible(rows int) {
	le.entry.SetMinRowsVisible(rows)
}

// OnChanged 设置文本变化回调
func (le *LinedEntry) OnChanged(f func(string)) {
	le.entry.OnChanged = f
}

// CreateRenderer 创建渲染器
func (le *LinedEntry) CreateRenderer() fyne.WidgetRenderer {
	return widget.NewSimpleRenderer(le.container)
}
